Rage Bait Content on Facebook: Mapping the Perceived Impacts and Engagement Behavior of Students at Visayas State University

Author

ViSERDAC

Published

February 1, 2026

1 Descriptive

1.1 Degree

Code
## need cleaning
socio_demo_dta |> 
  mutate(degree = str_remove_all(degree, "[0-9]|-")) |>
  mutate(degree = str_trim(degree, side = "both")) |> 
  count(degree, sort = T) |> 
  View()

1.2 Social Media

1.2.1 Platform

  • Female students are more active across diverse platforms, while male students concentrate usage on fewer platforms.

  • Females reported higher usage across nearly all platforms, with Facebook, TikTok, and Instagram as their top three.

  • Males also favored Facebook, but their engagement was lower overall, with Instagram and TikTok following.

Code
## subtitle
plt_subtitle <- str_wrap("Female students reported higher usage across most platforms, with Facebook, TikTok, and Instagram as the top three; male students also favored Facebook but showed comparatively lower engagement overall.", 120)

## plotting
plt_soc_med <- 
  soc_med_dta |>
  count(sex, social_media) |>
  group_by(sex) |>
  mutate(
    pct = n / sum(n),
    pct_lab = str_c("n=", n),
    social_media = reorder_within(social_media, n, sex)
  ) |>
  ggplot(aes(n, social_media, fill = sex)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = pct_lab), hjust = -0.1) +
  scale_y_reordered() +
  scale_x_continuous(limits = c(0, 80)) +
  facet_wrap(~ sex, scales = "free_y") +
  custom_theme +
  labs(
    title = "Which social media platforms do you use most often?",
    subtitle = plt_subtitle,
    fill = element_blank(),
    y = element_blank()
  )

## saving data
ggsave(
  plot = plt_soc_med,
  filename = "plot/soc_med_gender.jpg",
  unit = "in",
  width = 10,
  height = 7
)

## display plot
knitr::include_graphics("plot/soc_med_gender.jpg")

1.2.2 Social media content engagement by gender

  • Gender differences highlight that females lean toward lifestyle and advocacy, while males gravitate more toward gaming and politics.

  • Females engaged most with entertainment, music, and lifestyle content, followed by news and educational posts.

  • Males showed similar interest in entertainment and music but had stronger engagement with gaming content compared to females.

Code
## plot subtitle
plt_subtitle <- str_wrap("Entertainment, music, and lifestyle content were the most engaged categories among female students, while males showed stronger engagement with entertainment, music, and gaming; overall, females reported higher engagement across most content types.", 140)

plt_soc_med_content_gender <- 
  soc_med_content_dta |> 
  # filter(!str_detect( social_media, "All of it")) |> 
  count(sex, social_media_content) |> 
  group_by(sex) |> 
  mutate(pct = n / sum(n)) |> 
  mutate(social_media_content = reorder_within(social_media_content, pct, sex)) |> 
  mutate(pct_label = str_c("n=", n, " (", round(pct*100, ), "%)")) |> 
  ggplot(aes(pct, social_media_content, fill = sex)) + 
  geom_col(width = 0.8) +
  geom_text(aes(label = pct_label), hjust = -0.1) +
  scale_x_continuous(limits = c(0, 0.3), labels = scales::percent_format()) +
  scale_y_reordered() +
  facet_wrap(~ sex, scales = "free_y", ncol = 2) +
  custom_theme +
  labs(
    title = "What kinds of content do you usually engage with on social media?",
    subtitle = plt_subtitle,
    x = element_blank(),
    y = element_blank(),
    fill = element_blank()
  )

  ## saving plot
  ggsave(
    plot = plt_soc_med_content_gender,
    filename = "plot/soc_med_content_gender.jpg",
    unit = "in",
    height = 7,
    width = 12,
    dpi = 400
  )

## display plot
knitr::include_graphics("plot/soc_med_content_gender.jpg")

1.2.3 Social media content engagement by platform

  • Regardless of platform, students prioritize light, entertaining, and lifestyle-driven content, with serious topics less dominant.

  • Across platforms (Facebook, Instagram, TikTok, YouTube), entertainment, music, and lifestyle consistently ranked highest.

  • Educational and news content also attracted significant engagement, while politics and gaming were lower overall.

Code
## subtitle
plt_subtitle <- str_wrap("Across platforms, entertainment, music, and lifestyle content consistently drew the highest engagement, with Facebook, Instagram, TikTok, and YouTube showing similar patterns; educational and news content also ranked strongly, while politics and gaming remained lower overall.", 120)

plt_soc_med_content <- 
  soc_med_content_dta |> 
  filter(!str_detect( social_media, "All of it")) |> 
  count(social_media, social_media_content) |> 
  group_by(social_media) |> 
  mutate(pct = n / sum(n)) |> 
  mutate(social_media_content = reorder_within(social_media_content, pct, social_media)) |> 
  mutate(pct_label = str_c("n=", n, " (", round(pct*100, ), "%)")) |> 
  ggplot(aes(pct, social_media_content)) + 
  geom_col(width = 0.8) +
  geom_text(aes(label = pct_label), hjust = -0.1) +
  scale_x_continuous(limits = c(0, 0.3), labels = scales::percent_format()) +
  scale_y_reordered() +
  facet_wrap(~ social_media, scales = "free_y", ncol = 2) +
  custom_theme +
  labs(
    title = "What kinds of content do you usually engage with on social media?",
    subtitle = plt_subtitle,
    x = element_blank(),
    y = element_blank()
  )

  ## saving plot
  ggsave(
    plot = plt_soc_med_content,
    filename = "plot/soc_med_content.jpg",
    unit = "in",
    height = 14,
    width = 12,
    dpi = 400
  )

## display plot
knitr::include_graphics("plot/soc_med_content.jpg")

1.2.4 Daily time spent on social media by platform

  • Heavy usage patterns suggest social media is deeply embedded in daily routines, with some platforms fostering extended engagement.

  • Majority of students spend 3–6 hours daily on Facebook, Instagram, TikTok, and YouTube.

  • A notable proportion also reported more than 6 hours, especially on platforms like Reddit, X (Twitter), and Tumblr.

Code
# plot subtitle
plt_subtitle <- str_wrap("Most students reported spending 3–6 hours daily on social media, with Facebook, Instagram, TikTok, and YouTube showing the highest sustained use; a notable share of users also exceeded 6 hours, highlighting heavy engagement across platforms.", 120)

## plottign socila media hours use
plt_soc_med_hours <- 
  soc_med_category |> 
  filter(!str_detect( social_media, "All of|Tele")) |> 
  count(social_media, social_media_hours) |> 
  group_by(social_media) |> 
  mutate(pct = n / sum(n)) |> 
  mutate(social_media_hours = reorder_within(social_media_hours, pct, social_media)) |> 
  mutate(pct_label = str_c("n=", n, " (", round(pct*100, ), "%)")) |> 
  ggplot(aes(pct, social_media_hours)) + 
  geom_col(width = 0.8, position = position_dodge2(preserve = "single")) +
  geom_text(aes(label = pct_label), hjust = -0.1) +
  scale_x_continuous(limits = c(0, 1), labels = scales::percent_format()) +
  scale_y_reordered() +
  facet_wrap(~ social_media, scales = "free_y", ncol = 2) +
  custom_theme +
  labs(
    title = "On average, how many hours per day do you spend on social media?",
    x = NULL,
    y = NULL,
    subtitle = plt_subtitle
  )


## saving plot
ggsave(
  plot = plt_soc_med_hours,
  filename = "plot/soc_med_hours.jpg",
  unit = "in",
  height = 10,
  width = 10,
  dpi = 400
  )

## display plot
knitr::include_graphics("plot/soc_med_hours.jpg")

1.2.5 Daily time spent on social media by platform

  • Male students demonstrate more extreme usage, while female students cluster around moderate-to-high daily engagement

  • Females most often reported 3–6 hours daily, with fewer exceeding 6 hours.

  • Males were more likely to report over 6 hours of use, showing heavier overall consumption.

Code
# plot subtitle
plt_subtitle <- str_wrap("Female students most often reported spending 3–6 hours daily on social media, while males were more likely to exceed 6 hours; overall, both groups showed heavy usage concentrated in the mid-to-high ranges.", 100)

## plottign socila media hours use
plt_soc_med_hours_gender <- 
  soc_med_category |> 
  count(sex, social_media_hours) |> 
  group_by(sex) |> 
  mutate(pct = n / sum(n)) |> 
  mutate(social_media_hours = reorder_within(social_media_hours, pct, sex)) |> 
  mutate(pct_label = str_c("n=", n, " (", round(pct*100, ), "%)")) |> 
  ggplot(aes(pct, social_media_hours, fill = sex)) + 
  geom_col(width = 0.6, position = position_dodge2(preserve = "single")) +
  geom_text(aes(label = pct_label), hjust = -0.1) +
  scale_x_continuous(limits = c(0, 1), labels = scales::percent_format()) +
  scale_y_reordered() +
  facet_wrap(~ sex, scales = "free", ncol = 2) +
  custom_theme +
  labs(
    title = str_wrap("On average, how many hours per day do you spend on social media?", 60),
    x = NULL,
    y = NULL,
    fill = NULL,
    subtitle = plt_subtitle
  )


## saving plot
ggsave(
  plot = plt_soc_med_hours_gender,
  filename = "plot/soc_med_hours_gender.jpg",
  unit = "in",
  height = 6,
  width = 8,
  dpi = 400
  )

## display plot
knitr::include_graphics("plot/soc_med_hours_gender.jpg")

1.3 Rage bait factors

1.3.1 Affective Susceptability

Code
plt_affective_fct <- plt_rage_fct("Affective")

## saving plot
ggsave(
  plot = plt_affective_fct,
  filename = "plot/fct_affective.jpg",
  unit = "in",
  width = 11,
  height = 6,
  dpi = 400
)

## diplay plot
knitr::include_graphics("plot/fct_affective.jpg")

1.3.2 Critical Evaluation

Code
plt_critical_eval_fct <- plt_rage_fct("Critical")

## saving plot
ggsave(
  plot = plt_critical_eval_fct,
  filename = "plot/fct_critical_eval.jpg",
  unit = "in",
  width = 11,
  height = 5,
  dpi = 400
)

## diplay plot
knitr::include_graphics("plot/fct_critical_eval.jpg")

1.3.3 Perceived Risks

Code
plt_perceived_risk_fct <- plt_rage_fct("Perceived Risk")

## saving plot
ggsave(
  plot = plt_perceived_risk_fct,
  filename = "plot/fct_perceived_risk.jpg",
  unit = "in",
  width = 11,
  height = 7,
  dpi = 400
)

## diplay plot
knitr::include_graphics("plot/fct_perceived_risk.jpg")

1.3.4 Rage Bait Amplication

Code
plt_rb_amplication_fct <- plt_rage_fct("Bait Amplication")

## saving plot
ggsave(
  plot = plt_rb_amplication_fct,
  filename = "plot/fct_rb_amplication.jpg",
  unit = "in",
  width = 11,
  height = 5,
  dpi = 400
)

## diplay plot
knitr::include_graphics("plot/fct_rb_amplication.jpg")

1.3.5 Rage Bait Cue Recognition

Code
plt_rb_cue_recognition_fct <- plt_rage_fct("Cue Recognition")

## saving plot
ggsave(
  plot = plt_rb_cue_recognition_fct,
  filename = "plot/fct_rb_cue_recognition.jpg",
  unit = "in",
  width = 11,
  height = 6,
  dpi = 400
)

## diplay plot
knitr::include_graphics("plot/fct_rb_cue_recognition.jpg")

1.3.6 Rage Bait Engagement

Code
plt_rb_engagement_fct <- plt_rage_fct("Engagement")

## saving plot
ggsave(
  plot = plt_rb_engagement_fct,
  filename = "plot/fct_rb_engagement.jpg",
  unit = "in",
  width = 11,
  height = 6,
  dpi = 400
)

## diplay plot
knitr::include_graphics("plot/fct_rb_engagement.jpg")

1.3.7 Self-Regulation/Rage Bait Avoidance

Code
plt_rb_avoidance_fct <- plt_rage_fct("Avoidance")

## saving plot
ggsave(
  plot = plt_rb_avoidance_fct,
  filename = "plot/fct_rb_avoidance.jpg",
  unit = "in",
  width = 11,
  height = 4,
  dpi = 400
)

## diplay plot
knitr::include_graphics("plot/fct_rb_avoidance.jpg")

2 Exploratory Factor Analysis

2.1 Parallel analysis

Code
## parallel analysis
fa.parallel(fct_likert_dta, fa = "fa")

Parallel analysis suggests that the number of factors =  4  and the number of components =  NA 

2.2 Factor extraction

2.2.1 7 factors extracted

Code
# 7 factors
## elinating items
fa_rage_bait <- 
  fac(
  r = fct_likert_dta,
  nfactors = 7,
  rotate = "varimax"
)

## printing factor loadings
print(fa_rage_bait$loadings, sort = TRUE, cutoff = 0.36)

Loadings:
     MR1    MR6    MR3    MR4    MR5    MR2    MR7   
ce3   0.614                                          
ce4   0.605                                          
as5   0.544  0.435                                   
pr1   0.686                                          
pr2   0.833                                          
pr3   0.740                                          
pr4   0.724                                          
pr5   0.716                                          
pr6   0.701                                          
pr7   0.686                                          
rcr5         0.617                                   
rba2         0.603                                   
rba3         0.583                                   
rba4         0.539                                   
ce1          0.642                                   
sr1                 0.833                            
sr2                 0.665                            
sr3                 0.598                            
are1               -0.523                0.405       
as3                        0.522                     
rcr2                              0.523              
rcr4                              0.754              
as1                                      0.700       
rba1                                            0.685
rcr1         0.468                                   
rcr3                              0.418              
ce2   0.463                                          
as2                        0.456                     
as4                        0.495                     
are2         0.414                                   
are3         0.407                                   
are4               -0.361                            
are5               -0.452                            
are6  0.427                                          

                 MR1   MR6   MR3   MR4   MR5   MR2   MR7
SS loadings    5.977 3.341 2.662 1.370 1.306 1.141 1.003
Proportion Var 0.176 0.098 0.078 0.040 0.038 0.034 0.029
Cumulative Var 0.176 0.274 0.352 0.393 0.431 0.465 0.494

2.2.2 5 factors extracted

Code
# 5 factors
## elinating items
fct_likert_rm_dta <- 
  fct_likert_dta |>
  select(-starts_with("ce"), -pr6, -pr7, -as1, -as4, -as5, -rcr3, -rba1, -are5)

fa_rage_bait <- 
  fac(
  r = fct_likert_rm_dta,
  nfactors = 5,
  rotate = "varimax"
)

## printing factor loadings
print(fa_rage_bait$loadings, sort = TRUE, cutoff = 0.36)

Loadings:
     MR1    MR3    MR2    MR4    MR5   
pr1   0.646                            
pr2   0.839                            
pr3   0.850                            
pr4   0.726                            
pr5   0.643                            
rcr5         0.544                     
rba2         0.624                     
rba3         0.614                     
rba4         0.644                     
are2         0.512                     
sr1                 0.796              
sr2                 0.685              
sr3                 0.594              
rcr2                       0.548       
rcr4                       0.796       
as2                               0.639
as3                               0.523
rcr1         0.497                     
are1               -0.487              
are3         0.361                     
are4                                   
are6         0.424                     

                 MR1   MR3   MR2   MR4   MR5
SS loadings    3.247 2.735 2.064 1.069 0.950
Proportion Var 0.148 0.124 0.094 0.049 0.043
Cumulative Var 0.148 0.272 0.366 0.414 0.458

2.2.3 4 factors extracted

  • MR1: Risk Awareness
  • MR3: Rage bait recognition
  • MR2: Avoidance behavior
  • MR4: Affective susceptabiltiy
Code
# 4 factors
## elinating items
fct_likert_rm_dta <- 
  fct_likert_dta |> 
  select(-as5, -are1, -are2, -are3, -are4, -are5, -are6, -rcr1, -rcr2, -rcr3, -rcr4, -pr6, -pr7, -rba1, -as1, -pr1, -pr3)

fa_rage_bait <- 
  fac(
  r = fct_likert_rm_dta,
  nfactors = 4,
  rotate = "varimax"
)

## printing factor loadings
print(fa_rage_bait$loadings, sort = TRUE, cutoff = 0.46)

Loadings:
     MR1    MR3    MR2    MR4   
ce2   0.571                     
ce3   0.736                     
ce4   0.729                     
pr2   0.697                     
pr4   0.634                     
pr5   0.614                     
rcr5         0.612              
rba2         0.647              
rba3         0.587              
rba4         0.567              
ce1          0.616              
sr1                 0.821       
sr2                 0.631       
sr3                 0.679       
as3                        0.570
as4                        0.550
as2                        0.479

                 MR1   MR3   MR2   MR4
SS loadings    2.975 2.081 1.777 1.229
Proportion Var 0.175 0.122 0.105 0.072
Cumulative Var 0.175 0.297 0.402 0.474

3 PLS-SEM

3.1 Measurement and structural model

Code
# Define measurement model (outer model)
measurement_model <- constructs(
  composite("Risk Awareness",        
            multi_items(c(rep("ce", 3), rep("pr", 3)), c(2:4, c(2, 4, 5)))),              
  composite("Rage Bait Recognition",
            multi_items(c("rcr", rep("rba", 3), "ce"), c(5, 2:4, 1))),  
  composite("Avoidance Behavior", multi_items("sr", 1:3)),         

  composite("Affective Susceptibility", multi_items("as", 2:4))          
)

# Define structural model (inner model)
# Hypothesized paths based on your SEM framework
structural_model <- relationships(
  paths(from = "Rage Bait Recognition", to = c("Risk Awareness", "Affective Susceptibility", "Avoidance Behavior")),
  paths(from = "Risk Awareness", to = c("Avoidance Behavior", "Affective Susceptibility")),
  paths(from = "Affective Susceptibility", to = "Avoidance Behavior")
)

# Estimate the PLS model
pls_model <- estimate_pls(data = fct_likert_rm_dta,
                          measurement_model = measurement_model,
                          structural_model = structural_model)

# Summarize results
summary_pls_model <- summary(pls_model)

# plot the path diagram
plot(pls_model)

3.2 Bootstrapped PLS-SEM

Code
# Run bootstrapping with 1000 resamples 

boot_results <- bootstrap_model(pls_model, nboot = 10000, seed = 2026) 
plot(boot_results)
Code
# Summarize bootstrap results 
summary_boot_results <- summary(boot_results)

3.2.1 Reliability

Code
summary_pls_model$reliability
                         alpha  rhoC   AVE  rhoA
Rage Bait Recognition    0.762 0.831 0.502 0.776
Risk Awareness           0.840 0.879 0.550 0.858
Affective Susceptibility 0.550 0.657 0.447 0.315
Avoidance Behavior       0.751 0.856 0.664 0.762

Alpha, rhoC, and rhoA should exceed 0.7 while AVE should exceed 0.5

3.2.2 Validity

3.2.2.1 Fornell-Larcker Criterion

Code
summary_pls_model$validity$fl_criteria
                         Rage Bait Recognition Risk Awareness
Rage Bait Recognition                    0.708              .
Risk Awareness                           0.463          0.742
Affective Susceptibility                 0.168          0.314
Avoidance Behavior                       0.063          0.173
                         Affective Susceptibility Avoidance Behavior
Rage Bait Recognition                           .                  .
Risk Awareness                                  .                  .
Affective Susceptibility                    0.668                  .
Avoidance Behavior                          0.183              0.815

FL Criteria table reports square root of AVE on the diagonal and construct correlations on the lower triangle.

3.2.2.2 Heterotrait-Monotrait Criterion

Code
summary_pls_model$validity$htmt
                         Rage Bait Recognition Risk Awareness
Rage Bait Recognition                        .              .
Risk Awareness                           0.512              .
Affective Susceptibility                 0.378          0.348
Avoidance Behavior                       0.153          0.249
                         Affective Susceptibility Avoidance Behavior
Rage Bait Recognition                           .                  .
Risk Awareness                                  .                  .
Affective Susceptibility                        .                  .
Avoidance Behavior                          0.248                  .

3.2.3 Path estimates

Code
summary_boot_results$bootstrapped_paths |> 
  as.data.frame() |> 
  rownames_to_column("Path") |> 
  tibble() |> 
  mutate(across(.cols = is.numeric, ~ round(.x, 3))) |> 
  DT::datatable()

3.2.4 Indirect path estimates

Code
summary_boot_results$bootstrapped_total_indirect_paths |> 
  as.data.frame() |> 
  rownames_to_column("Path") |> 
  tibble() |> 
  mutate(across(.cols = is.numeric, ~ round(.x, 3))) |> 
  DT::datatable()

3.2.5 Total path estimates

Code
summary_boot_results$bootstrapped_total_paths |> 
  as.data.frame() |> 
  rownames_to_column("Path") |> 
  tibble() |> 
  mutate(across(.cols = is.numeric, ~ round(.x, 3))) |> 
  DT::datatable()